home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_054 / ispell / term.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  215 lines

  1. /* -*- Mode:Text -*- */
  2. /*
  3.  * term.c - deal with termcap, and unix terminal mode settings
  4.  *
  5.  * Pace Willisson, 1983
  6.  */
  7.  
  8. #include <stdio.h>
  9.  
  10. #ifdef unix
  11. #  include <sgtty.h>
  12. #endif
  13.  
  14. #include <signal.h>
  15. #include "ispell.h"
  16.  
  17. #ifdef AMIGA
  18. char PC = '\000';        /* padding character */
  19. char *BC = "\033[D";        /* backspace if not ^H */
  20. char *cd = "\033[J";        /* clear to end of display */
  21. char *cl = "\033[H\033[J";        /* clear display */
  22. char *cm = "\033[%i%2;%2H";    /* cursor movement */
  23. char *ho = "\033[H";        /* home */
  24. char *so = "\033[7;30;31m";    /* standout */
  25. char *se = "\033[0;30;31m";    /* standout end */
  26. int li=22;            /* lines */
  27. #else
  28. char PC;    /* padding character */
  29. char *BC;    /* backspace if not ^H */
  30. char *cd;    /* clear to end of display */
  31. char *cl;    /* clear display */
  32. char *cm;    /* cursor movement */
  33. char *ho;    /* home */
  34. char *so;    /* standout */
  35. char *se;    /* standout end */
  36. int li;        /* lines */
  37. #endif
  38.  
  39. char termcap[1024];
  40. char termstr[1024];    /* for string values */
  41. char *termptr;
  42.  
  43. int erasechar;
  44. int killchar;
  45.  
  46. char tempfile[200];
  47.  
  48. extern int putch();
  49.  
  50. erase ()
  51. {
  52.     if (cl)
  53.         tputs(cl, li, putch);
  54.     else {
  55.         if (ho)
  56.             tputs(ho, 100, putch);
  57.         else if (cm)
  58.             tputs(tgoto(cm, 0, 0), 100, putch);
  59.         tputs(cd, li, putch);
  60.     }
  61. }
  62.  
  63. move (row, col)
  64. {
  65.     tputs (tgoto (cm, col, row), 100, putch);
  66. }
  67.  
  68. inverse ()
  69. {
  70.     tputs (so, 10, putch);
  71. }
  72.  
  73. normal ()
  74. {
  75.     tputs (se, 10, putch);
  76. }
  77.  
  78. backup ()
  79. {
  80.     if (BC)
  81.         tputs (BC, 1, putch);
  82.     else
  83.         putchar ('\b');
  84. }
  85.  
  86. putch (c)
  87. {
  88.     putchar (c);
  89. }
  90.  
  91. #ifdef unix
  92. struct sgttyb sbuf, osbuf;
  93. #endif
  94.  
  95. static termchanged = 0;
  96.  
  97.  
  98. terminit ()
  99. {
  100.     int done();
  101.     int tpgrp;
  102.     int onstop();
  103.     extern short ospeed;
  104.  
  105. retry:
  106. #ifdef unix
  107.     sigsetmask(1<<SIGTSTP | 1<<SIGTTIN | 1<<SIGTTOU);
  108.     if (ioctl(0, TIOCGPGRP, &tpgrp) != 0) {
  109.         fprintf (stderr, "Can't deal with non interactive use yet.\n");
  110.         exit (1);
  111.     }
  112.     if (tpgrp != getpgrp(0)) { /* not in foreground */
  113.         sigsetmask(1<<SIGTSTP | 1<<SIGTTIN);
  114.         signal(SIGTTOU, SIG_DFL);
  115.         kill(0, SIGTTOU);
  116.         /* job stops here waiting for SIGCONT */
  117.         goto retry;
  118.     }
  119.  
  120.     ioctl (0, TIOCGETP, &osbuf);
  121.     termchanged = 1;
  122.  
  123.     sbuf = osbuf;
  124.     sbuf.sg_flags &= ~ECHO;
  125.     sbuf.sg_flags |= RAW;
  126.     ioctl (0, TIOCSETP, &sbuf);
  127.  
  128.     erasechar = sbuf.sg_erase;
  129.     killchar = sbuf.sg_kill;
  130.     ospeed = sbuf.sg_ospeed;
  131.  
  132.     signal (SIGINT, done);
  133.  
  134.     sigsetmask(0);
  135.     signal(SIGTTIN, onstop);
  136.     signal(SIGTTOU, onstop);
  137.     signal(SIGTSTP, onstop);
  138.  
  139.     tgetent(termcap, getenv("TERM"));
  140.     termptr = termstr;
  141.     BC = tgetstr("bc", &termptr);
  142.     cd = tgetstr("cd", &termptr);
  143.     cl = tgetstr("cl", &termptr);
  144.     cm = tgetstr("cm", &termptr);
  145.     ho = tgetstr("ho", &termptr);
  146.     so = tgetstr("so", &termptr);    /* inverse video on */
  147.     se = tgetstr("se", &termptr);    /* inverse video off */
  148.     li = tgetnum("li");    
  149. #endif
  150.  
  151. }
  152.  
  153. done ()
  154. {
  155.     unlink (tempfile);
  156. #ifdef unix
  157.     if (termchanged)
  158.         ioctl (0, TIOCSETP, &osbuf);
  159. #endif
  160.     exit (0);
  161. }
  162.  
  163. #ifdef unix
  164.  
  165. onstop(signo)
  166. int signo;
  167. {
  168.     ioctl (0, TIOCSETP, &osbuf);
  169.     signal(signo, SIG_DFL);
  170.     kill(0, signo);
  171.     /* stop here until continued */
  172.     signal(signo, onstop);
  173.     ioctl (0, TIOCSETP, &sbuf);
  174. }
  175. #endif
  176.  
  177. stop ()
  178. {
  179. #ifdef unix
  180.     onstop (SIGTSTP);
  181. #else
  182.     fprintf (stderr, "sorry -- stop not implemented yet\n");
  183.     fflush (stderr);
  184.     sleep (2);
  185. #endif
  186. }
  187.  
  188. shellescape (buf)
  189. char *buf;
  190. {
  191. #ifdef unix
  192.     ioctl (0, TIOCSETP, &osbuf);
  193.     signal (SIGINT, 1);
  194.     signal (SIGQUIT, 1);
  195.     signal(SIGTTIN, SIG_DFL);
  196.     signal(SIGTTOU, SIG_DFL);
  197.     signal(SIGTSTP, SIG_DFL);
  198. #endif
  199.  
  200.     system (buf);
  201.  
  202. #ifdef unix
  203.     signal(SIGTTIN, onstop);
  204.     signal(SIGTTOU, onstop);
  205.     signal(SIGTSTP, onstop);
  206.     signal (SIGINT, done);
  207.     signal (SIGQUIT, SIG_DFL);
  208.  
  209.     ioctl (0, TIOCSETP, &sbuf);
  210. #endif
  211.  
  212.     printf ("\n-- Type space to continue --");
  213.     getchar ();
  214. }
  215.